簡單介紹 SSR & Next.js
在前面有提到 react 是一個 CSR( Client Side Rendering) 的前端 Library,什麼是 CSR 呢?
CSR 顧名思義,就是網頁上所有的內容都是在前端透過 JavaScript 來產生的,當用戶對 server 發送 request 的時候後端回覆的 html 文件通常只有非常基礎的內容以及一個 root
的 div tag,沒有其他東西了。
可以在前面示範過的任何一個專案點擊滑鼠右鍵,然後瀏覽網頁原始碼,就會看到這個畫面,不管你網頁的內容有多豐富多精美,在 server 這邊回應的 html 文件就只有這樣。
SSR 跟 CSR 不同,SSR 是在 Server 端就執行獲取資料的行為,把取得的資料產生成一份完整的 html 文件,然後才做 response 的動作,所以用戶端這邊就會直接取得完整的 html 文件,不需要透過 JavaScript 產生網頁上的內容。
另外除了 CSR 跟 SSR 以外還有一個 SSG
SSG 跟 SSR 有些類似,但是有一點不同,SSR 會在收到 request 的時後執行獲取資料的動作,但是並不是所有的頁面都會有這個需求,有的頁面可能內容是固定不會改變的,比如首頁或是服務中心等...,這個時候就可以透過 SSG 來處理。
SSG 產生的 html 不是在收到 request 的時候才產生的,而是在 build 專案時就產生一份固定的 html,在之後當用戶對 server 發送請求時 server 就會直接回覆 SSG 所產生的 html,藉此來減輕 server 端產生 html 的壓力。
簡單帶過 CSR / SSR / SSG 的差異之後,在 react 的專案裡面要怎麼實現 SSR / SSG 的效果呢?
在 react 裡面如果要實現 SSR 跟 SSG 的效果,會需要透過 express 另外起一個 server,來做 response,還會需要使用到 react-dom/server
所提供的 renderToString
或者是其他 API 來協助做到產生靜態 html,然後在本來的 index.js
裡面的 ReactDOM.createRoot(root).render(<App / >)
也必須要改成 ReactDOM.hydrate(<App />, root)
才可以,跟過去相比會有比較複雜多流程以及較高的學習曲線,但是這些內容我們都可以透過 Next.js 來簡化。
Next.js 是由 Vercel 團隊所維護的 react 全端框架,搭配 react 18 之後所推出的 server component 讓我們在開發的過程中可以自行定義 component 要在 server 產生或是在 client 產生,依照不同的情境跟需求來讓我們的產品可以有 SSR / SSG 的結果。
我們可以透過簡單的指令來建立一個 next.js 的專案。
npx create-next-app@latest
oryarn create next-app
輸入完指令之後會出現下面這些問題:
src/
directory?都回答完之後就成功建立一個基本的 next.js 專案了。
可以 cd 進到路徑啟動專案看看。
npm run dev
oryarn dev
到 port 3000 看到這個畫面就代表你成功啟動專案了。
上面有提到 Next.js 會幫我們處理 SSR / SSG 的部分,可以點擊滑鼠右鍵看看檢視網頁原始碼。
會發現原始碼不再是空空的只有一個 <div id="root"></div>
元素,而是很多網頁上具備的內容了。
renderToString - react document
Next.js document
下一篇終於結束啦!
如果內容有誤再麻煩大家指教,我會馬上修改。
這個系列的文章會同步更新在我個人的 Medium,歡迎大家來看看 👋👋👋
Medium